/**
 * 生成指定位数的随机数
 * @param {int} x
 */
export function randomStr(x) {
  let s = "";
  while (s.length < x && x > 0) {
    let v = Math.random() < 0.5 ? 32 : 0;
    s += String.fromCharCode(Math.round(Math.random() * ((122 - v) - (97 - v)) + (97 - v)));
  }
  return s;
}

export function isNumber(val) {

  var regPos = /^\d+(\.\d+)?$/; //非负浮点数
  var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
  if (regPos.test(val) || regNeg.test(val)) {
    return true;
  } else {
    return false;
  }

}

/**
 * 对像转成url查询字符串
 * @param {object} obj
 */
export function param(obj) {
  var arr = Object.keys(obj).map(function (k) {
    return k + '=' + encodeURIComponent(obj[k])
  })
  return arr.join('&').replace(/%20/g, '+')
}

/**
 * 是否为数组
 * @param {any} val
 */
export function isArray(val) {
  return (val != null && typeof val != 'function' && typeof val.length == 'number')
}

/**
 * 是否为function
 * @param {any} val
 */
export function isFunction(val) {
  return val && {}.toString.call(val) === '[object Function]'
}

/**
 * 是否为对像
 * @param {any} val
 */
export function isObject(val) {
  return val && {}.toString.call(val) === '[object Object]'
}

export function asyncFunc(func) {
  return () => new Promise((resolve, reject) => resolve(isFunction(func) ? resolve(func(arguments)) : reject(new TypeError(func + 'is not function'))));
}

/**
 * 延时任意毫秒
 * @param {number} time 毫秒
 * 例：
 *   delay(500).then(() => console.log('after 500ms'))
 */
export function delay(time = 0) {
  return new Promise((res, rej) => setTimeout(res, time));
}

// 处理对象，删除对象中的 null undefine 元素
export function removeNullItem(o, arr, i) {
  let s = ({}).toString.call(o);
  if (s == '[object Array]') {
    if (processArray(o) === true) {//o也是数组，并且删除完子项，从所属数组中删除
      if (arr) arr.splice(i, 1);
    }
  } else if (s == '[object Object]') {
    proccessObject(o);
    if (arr && isEmptyObj(o)) arr.splice(i, 1);
  }
}

function isEmptyObj(o) {
  for (let attr in o) return !1;
  return !0
}

function processArray(arr) {
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i] === null || arr[i] === undefined) arr.splice(i, 1);
    else if (typeof arr[i] == 'object') removeNullItem(arr[i], arr, i);
  }
  return arr.length == 0
}

function proccessObject(o) {
  for (let attr in o) {
    if (o[attr] === null || o[attr] === undefined) delete o[attr];
    else if (typeof o[attr] == 'object') {
      removeNullItem(o[attr]);
      if (isEmptyObj(o[attr])) delete o[attr];
    }
  }
}



